package work.flow.demo.api;

import org.flowable.engine.IdentityService;
import org.flowable.engine.ProcessEngine;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.idm.api.Group;
import org.flowable.idm.api.User;
import org.flowable.task.api.Task;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class LeaveProcessApi {

    @Qualifier("LeaveProcessEngine")
    private final ProcessEngine processEngine;

    public LeaveProcessApi(ProcessEngine processEngine) {
        this.processEngine = processEngine;
    }

    //添加请假发起人
    @GetMapping("/leave_01")
    public String get01(@RequestParam Map<String, String> params) {
        //参数-发起人
        String userId = params.get("userId");

        if (userId == null || userId.isEmpty()) {
            return "请输入用户ID";
        }
        IdentityService identityService = processEngine.getIdentityService();
        // 1、创建用户组,user_g和bpmn文件中的组对应，
        //创建组，BPMN流程定义中使用了 student_group 作为候选组，但这并不会自动在Flowable的身份服务中创建实际的组
        Group existingGroup = identityService.createGroupQuery().groupId("student_group").singleResult();
        if (existingGroup == null) {
            Group starterGroup = identityService.newGroup("student_group");
            starterGroup.setName("学生组");
            identityService.saveGroup(starterGroup);
        }
        // 2、检查用户是否在授权组中
        boolean isAuthorized = identityService.createGroupQuery()//
                .groupMember(userId)//
                .groupId("student_group")//
                .count() > 0;//

        if (isAuthorized) {
            return "该用户已经授权发起请假流程，请不要重复添加";
        } else {
            //创建用户
            User newUser = identityService.newUser(userId);
            identityService.saveUser(newUser);
            // 将用户加入组
            identityService.createMembership(userId, "student_group");
            return "用户已经授权发起请假流程-" + userId;
        }
    }


    //查询某个组的所有人
    @GetMapping("/leave_02")
    public String get02(@RequestParam Map<String, String> params) {
        //参数-发起人
        String groupName = params.get("groupName");
        IdentityService identityService = processEngine.getIdentityService();

        if (groupName == null || groupName.isEmpty()) {
            // 查询所有用户
            List<User> users = identityService.createUserQuery().list();
            // 遍历用户
            for (User user : users) {
                System.out.println("==========================================");
                List<Group> groups = identityService.createGroupQuery().groupMember(user.getId()).orderByGroupId().asc().list();
                if (groups.isEmpty()) {
                    System.out.println("所属组: 无");
                } else {
                    System.out.println("所属组 (" + groups.size() + "个):");
                    for (Group group : groups) {
                        System.out.println("  - " + group.getId() + " (" + group.getName() + ")");
                    }
                }
                System.out.println("User ID: " + user.getId() + ", Name: " + user.getFirstName() + " " + user.getLastName());
            }
        }

        // 查询组的所有成员
        List<User> users = identityService.createUserQuery().memberOfGroup(groupName)  // 替换为实际的组名
                .list();

        // 遍历用户
        for (User user : users) {
            System.out.println("User ID: " + user.getId() + ", Name: " + user.getFirstName() + " " + user.getLastName());
        }
        //
        return "查询成功";
    }

    //删除用户
    @GetMapping("/leave_03")
    public String get03(@RequestParam Map<String, String> params) {
        IdentityService identityService = processEngine.getIdentityService();
        // 从组中删除指定用户
        identityService.deleteMembership("hm", "student_group");
        //删除用户
        identityService.deleteUser("hm");
        return "删除成功";
    }

    //添加辅导员组
    @GetMapping("/leave_04")
    public String get04(@RequestParam Map<String, String> params) {
        //参数-发起人
        String userId = params.get("userId");

        if (userId == null || userId.isEmpty()) {
            return "请输入用户ID";
        }
        IdentityService identityService = processEngine.getIdentityService();
        // 1、创建用户组,user_g和bpmn文件中的组对应，
        //创建组，BPMN流程定义中使用了 student_group 作为候选组，但这并不会自动在Flowable的身份服务中创建实际的组
        Group existingGroup = identityService.createGroupQuery().groupId("counselor_group").singleResult();
        if (existingGroup == null) {
            Group starterGroup = identityService.newGroup("counselor_group");
            starterGroup.setName("辅导员组");
            identityService.saveGroup(starterGroup);
        }
        // 2、检查用户是否在授权组中
        boolean isAuthorized = identityService.createGroupQuery()//
                .groupMember(userId)//
                .groupId("counselor_group")//
                .count() > 0;//

        if (isAuthorized) {
            return "该用户已经授权发起请假流程，请不要重复添加";
        } else {
            //创建用户
            User newUser = identityService.newUser(userId);
            identityService.saveUser(newUser);
            // 将用户加入组
            identityService.createMembership(userId, "counselor_group");
            return "用户已经授权辅导员-" + userId;
        }
    }

    //发起请假
    @GetMapping("/leave_05")
    public String get05(@RequestParam Map<String, String> params) {
        //参数-发起人
        String userId = params.get("userId");

        if (userId == null || userId.isEmpty()) {
            return "请输入用户ID";
        }

        // 1、检查用户是否在授权组中
        IdentityService identityService = processEngine.getIdentityService();
        boolean isAuthorized = identityService.createGroupQuery()//
                .groupMember(userId)//
                .groupId("student_group")//
                .count() > 0;//
        if (!isAuthorized) {
            return "该用户没有授权请假流程";
        }

        //2、获取流程实例
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //3、发起流程,businessK业务id不可变
        String processId = "vp_001";//对应bpmn文件中的process id
        Map<String, Object> variables = new HashMap<>();
        variables.put("initiator", userId);//发起人->用于查询谁发起的请假
        variables.put("leave", "5");//请假天数
        variables.put("reason", "去旅游");//请假理由
        //用时间做业务businessKey
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        String businessKey = formatter.format(date);
        //启动流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processId, businessKey, variables);
        //根据流程id查询任务
//        TaskService taskService = processEngine.getTaskService();
//        Task currentTask = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
//        //分配任务给当前的用户
//        taskService.setAssignee(currentTask.getId(), userId);  // 直接设置任务受理人
//        //taskService.complete(currentTask.getId());//流程继续流程
//        //查询用户任务
//        List<Task> tasks = taskService.createTaskQuery()//
//                .taskAssignee(userId)//根据用户id查询任务
//                .list();
//        if (!tasks.isEmpty()) {
//            for (Task task : tasks) {
//                System.out.println("需先完成任务: " + task.getName());
//                taskService.setAssignee(task.getId(), "wangwu");  // 直接设置任务受理人
//                taskService.complete(task.getId());//流程继续流程
//                //taskService.complete(task.getId());  // 完成任务，流转到班主任任务(不指定用户处理)
//            }
//        }

        TaskService taskService = processEngine.getTaskService();
        List<Task> tasks = taskService.createTaskQuery()//
                .taskCandidateUser(userId)//根据用户id查询任务
                .list();
        // 查询下一个流程组内的所有成员
        List<User> users = identityService.createUserQuery().memberOfGroup("counselor_group").list();
        for (User user : users) {
            System.out.println("User ID: " + user.getId());
        }
        if (!tasks.isEmpty()) {
            for (Task task : tasks) {
                System.out.println("需先完成任务: " + task.getName());
                taskService.setAssignee(task.getId(), "wangwu");  // 直接设置任务受理人
//                taskService.complete(task.getId());//流程继续流程
                //taskService.complete(task.getId());  // 完成任务，流转到班主任任务(不指定用户处理)
            }
        }


//        String id = processInstance.getId();
//
//        List<Task> tasks = taskService.createTaskQuery()//
//                .taskCandidateUser(userId)//根据用户id查询任务
//                .list();
//        // 查询下一个流程组内的所有成员
//        List<User> users = identityService.createUserQuery().memberOfGroup("counselor_group").list();
//        for (User user : users) {
//            System.out.println("User ID: " + user.getId());
//        }
//        if (!tasks.isEmpty()) {
//            for (Task task : tasks) {
//                System.out.println("需先完成任务: " + task.getName());
//                taskService.setAssignee(task.getId(), "wangwu");  // 直接设置任务受理人
//                taskService.complete(task.getId());//流程继续流程
//                //taskService.complete(task.getId());  // 完成任务，流转到班主任任务(不指定用户处理)
//            }
//        }
        return "用户：" + userId + "请假成功" + processInstance.getId();
    }

    //辅导员受理
    @GetMapping("/leave_06")
    public String get06(@RequestParam Map<String, String> params) {
        //参数-发起人
        String userId = params.get("userId");

        if (userId == null || userId.isEmpty()) {
            return "请输入用户ID";
        }

        // 1、检查用户是否在授权组中
        IdentityService identityService = processEngine.getIdentityService();
        boolean isAuthorized = identityService.createGroupQuery()//
                .groupMember(userId)//
                .groupId("counselor_group")//
                .count() > 0;//
        if (!isAuthorized) {
            return "该用户没有授权处理请假流程";
        }

        //2、获取流程实例
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //查询该用户当前的任务
        TaskService taskService = processEngine.getTaskService();
        List<Task> tasks = taskService.createTaskQuery()//
                .taskAssignee(userId)//根据用户id查询所属于该用户的任务
                .list();
        // 查询下一个流程组内的所有成员
        List<User> users = identityService.createUserQuery().memberOfGroup("director_group").list();
        for (User user : users) {
            System.out.println("下一流程User ID: " + user.getId());
        }
        if (!tasks.isEmpty()) {
            for (Task task : tasks) {
                System.out.println("需先完成任务: " + task.getName());
                ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
                System.out.println("BusinessKey: " + processInstance.getBusinessKey());
                //taskService.setAssignee(task.getId(), "wangwu");  // 直接设置任务受理人
                //taskService.complete(task.getId());  // 完成任务，流转到班主任任务(不指定用户处理)

                Map<String, Object> variables = new HashMap<>();
                variables.put("approval", 1); // 关键：设置为1触发驳回
                taskService.complete(task.getId(), variables);
                System.out.println("驳回任务: " + task.getId());
            }
        }
        return "用户：" + userId + "处理请假成功";
    }

    //查询任务
    @GetMapping("/leave_07")
    public String get07(@RequestParam Map<String, String> params) {
        //参数-发起人
        String userId = params.get("userId");

        if (userId == null || userId.isEmpty()) {
            return "请输入用户ID";
        }

        // 1、检查用户是否在授权组中
        IdentityService identityService = processEngine.getIdentityService();
        boolean isAuthorized = identityService.createGroupQuery()//
                .groupMember(userId)//
                .groupId("student_group")//
                .count() > 0;//
        if (!isAuthorized) {
            return "该用户没有授权请假流程";
        }

        TaskService taskService = processEngine.getTaskService();
        List<Task> tasks = taskService.createTaskQuery()//
                .taskCandidateUser(userId)//根据用户id查询任务
                .list();
        // 查询下一个流程组内的所有成员
        List<User> users = identityService.createUserQuery().memberOfGroup("counselor_group").list();
        for (User user : users) {
            System.out.println("User ID: " + user.getId());
        }
        if (!tasks.isEmpty()) {
            for (Task task : tasks) {
                System.out.println("------------- " );
                System.out.println("需先完成任务: " + task.getName());
                System.out.println("需先完成任务: " + task.getId());
//                taskService.setAssignee(task.getId(), "wangwu");  // 直接设置任务受理人
//                taskService.complete(task.getId());//流程继续流程
                //taskService.complete(task.getId());  // 完成任务，流转到班主任任务(不指定用户处理)
            }
        }


        return "用户：" + userId + "查询任务成功" ;
    }
}
